package com.hillky.config;

import com.hillky.IdGenerator;
import com.hillky.ProtocolConfig;
import com.hillky.RegistryConfig;
import com.hillky.compress.Compressor;
import com.hillky.compress.impl.GzipCompressor;
import com.hillky.loadbalancer.LoadBalancer;
import com.hillky.loadbalancer.impl.RoundRobinLoadBalancer;
import com.hillky.protection.CircuitBreaker;
import com.hillky.protection.RateLimiter;
import com.hillky.protection.TokenBuketRateLimiter;
import com.hillky.serialize.Serializer;
import com.hillky.serialize.impl.JdkSerializer;
import lombok.Builder;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.*;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 全局的配置类
 * 代码配置 --> xml配置 --> 默认项
 */
@Data
@Slf4j
public class Configuration {

    // 配置信息 -->端口号
    private int port = 8092;

    // 配置信息 -->应用程序名字
    private  String appName;

    // 分组信息
    private String group="default";

    // 配置信息 -->注册中心
    private RegistryConfig registryConfig =new RegistryConfig("zookeeper://127.0.0.1:2181");

    // 配置信息 -->序列化协议
    private  String serializeType="jdk";

    // 配置信息 -->压缩的协议
    private  String compressType="gzip";



    // 配置信息 -->ID生成器
    private IdGenerator idGenerator=new IdGenerator(1L,2L);

    // 配置信息 -->负载均衡策略
    private  LoadBalancer loadBalancer=new RoundRobinLoadBalancer();

    // 为每一个ip配置一个限流器
    private final Map<SocketAddress, RateLimiter> everyIpRateLimiter=new ConcurrentHashMap<>(16);

    // 为每一个ip配置一个断路器
    private final Map<SocketAddress, CircuitBreaker> everyIpCircuitBreaker=new ConcurrentHashMap<>(16);

    // 读xml

    public Configuration() {
        // 1.成员配置默认配置项

        // 2.spi机制发现相关配置
        SpiResolver spiResolver = new SpiResolver();
        spiResolver.loadFormSpi(this);

        // 3.通过读取xml获得上面的信息
        XmlResolver xmlResolver = new XmlResolver();
        xmlResolver.loadFormXml(this);

        // 4.编程配置项 yrpcBootstrap提供

    }

    public static void main(String[] args) {
        Configuration configuration = new Configuration();
    }



}
